//package com.example.saas.datasource;
//
//import com.alibaba.druid.pool.DruidDataSourceFactory;
//import com.example.saas.context.DataSourceContext;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
//
//import javax.sql.DataSource;
//import java.util.Map;
//import java.util.concurrent.ConcurrentHashMap;
//
///**
// * 写法二：动态数据源配置-基于原生AbstractRoutingDataSource进行扩展
// */
//@Slf4j
//public class DynamicDataSource extends AbstractRoutingDataSource {
//
//    private static Map<Object, Object> targetDataSourceMap = new ConcurrentHashMap<>();
//
//
//    public DynamicDataSource(DataSource defaultTargetDataSource, Map<Object, Object> targetDataSources)
//    {
//        super.setDefaultTargetDataSource(defaultTargetDataSource);
//        super.setTargetDataSources(targetDataSources);
//        super.afterPropertiesSet();
//        targetDataSourceMap = targetDataSources;
//    }
//
//
//    /**
//     * 数据库连接前设置的数据源
//     */
//    @Override
//    protected Object determineCurrentLookupKey() {
//        return DataSourceContext.getDataSourceKey();
//    }
//
//    /**
//     * 设置额外数据源
//     */
//    @Override
//    public void setTargetDataSources(Map<Object, Object> targetDataSources){
//        super.setTargetDataSources(targetDataSources);
//        super.afterPropertiesSet();
//        targetDataSourceMap = targetDataSources;
//    }
//
//    /**
//     * 判断是否存在数据源
//     */
//    public boolean isExistDataSource(String key){
//        return targetDataSourceMap.containsKey(key);
//    }
//
//    /**
//     * 添加数据源
//     */
//    public void addDataSource(String key, Map<String, Object> dataSourceProperties){
//        targetDataSourceMap.put(key, buildDataSource(dataSourceProperties));
//        super.setTargetDataSources(targetDataSourceMap);
//        super.afterPropertiesSet();
//    }
//
//    /**
//     * 构建数据源
//     * @param dataSourceProperties 数据源配置
//     */
//    private DataSource buildDataSource(Map<String, Object> dataSourceProperties) {
//        DataSource dataSource;
//        try {
//             dataSource = DruidDataSourceFactory.createDataSource(dataSourceProperties);
//        }catch (Exception e){
//             log.error("构建数据源失败, 数据源配置: {}, 错误：{}", dataSourceProperties.toString(), e.getMessage());
//             throw new RuntimeException();
//        }
//        return dataSource;
//    }
//}
